{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "8db7f58a-25d9-44ca-8520-9148ad1073aa",
   "metadata": {},
   "source": [
    "Chapter 12\n",
    "\n",
    "# 利用statsmodels.multivariate.pca完成主成分分析\n",
    "《线性代数》 | 鸢尾花书：数学不难"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ad4e88f5-35a3-4666-adf4-fa19efafc02d",
   "metadata": {},
   "source": [
    "这段代码以主成分分析（PCA）为核心，完整实现了对高维数据的降维、可视化、解释方差计算和低维近似还原等步骤，具有严密的数学逻辑。下面我们按步骤详细分析其数学意义，并穿插相应公式。\n",
    "\n",
    "---\n",
    "\n",
    "首先，导入所需的库，其中 `statsmodels.multivariate.pca` 模块用于执行PCA分析。然后读取数据集 $X$，我们记作：\n",
    "\n",
    "$X \\in \\mathbb{R}^{n \\times d}$，其中 $n$ 表示样本个数，$d$ 表示原始特征维度。\n",
    "\n",
    "---\n",
    "\n",
    "接着计算的是数据的**线性相关性系数矩阵**，即：\n",
    "\n",
    "$P = \\text{corr}(X)$\n",
    "\n",
    "该矩阵 $P \\in \\mathbb{R}^{d \\times d}$ 中的第 $(i,j)$ 元素是第 $i$ 和第 $j$ 个特征的皮尔逊相关系数，度量的是它们之间的线性关系，范围在 $[-1, 1]$ 之间。\n",
    "\n",
    "---\n",
    "\n",
    "随后进入主成分分析部分：\n",
    "\n",
    "```python\n",
    "pca_model = pca.PCA(X_df, standardize=True)\n",
    "```\n",
    "\n",
    "执行了以下数学操作：\n",
    "\n",
    "- 首先对数据 $X$ 做标准化，即对每一列特征 $x_j$ 减去其均值 $\\mu_j$ 并除以标准差 $\\sigma_j$：\n",
    "\n",
    "$$\n",
    "\\tilde{X}_{ij} = \\frac{X_{ij} - \\mu_j}{\\sigma_j}\n",
    "$$\n",
    "\n",
    "- 然后计算标准化数据 $\\tilde{X}$ 的协方差矩阵：\n",
    "\n",
    "$$\n",
    "\\Sigma = \\frac{1}{n-1} \\tilde{X}^T \\tilde{X}\n",
    "$$\n",
    "\n",
    "- 对协方差矩阵进行**特征值分解（谱分解）**：\n",
    "\n",
    "$$\n",
    "\\Sigma = V \\Lambda V^T\n",
    "$$\n",
    "\n",
    "其中 $\\Lambda$ 是一个对角矩阵，包含从大到小排列的特征值 $\\lambda_1, \\lambda_2, ..., \\lambda_d$，$V$ 是其对应的特征向量矩阵，每一列是一个主成分方向。\n",
    "\n",
    "---\n",
    "\n",
    "代码中：\n",
    "\n",
    "```python\n",
    "variance_V = pca_model.eigenvals\n",
    "```\n",
    "\n",
    "表示 $\\Lambda$ 中的各个 $\\lambda_k$，即每个主成分对应的方差。\n",
    "\n",
    "解释方差占比为：\n",
    "\n",
    "$$\n",
    "\\text{explained\\_var\\_ratio}_k = \\frac{\\lambda_k}{\\sum_{j=1}^{d} \\lambda_j}\n",
    "$$\n",
    "\n",
    "该比值反映了第 $k$ 个主成分对整体数据方差的解释能力。\n",
    "\n",
    "---\n",
    "\n",
    "陡坡图（Scree Plot）通过蓝线显示每个主成分的方差（即特征值），通过红线显示累计解释方差百分比：\n",
    "\n",
    "$$\n",
    "\\text{Cumulative}_k = \\sum_{j=1}^{k} \\text{explained\\_var\\_ratio}_j \\times 100\\%\n",
    "$$\n",
    "\n",
    "这个图用于判断选取前几个主成分作为主要表示空间是否足够。\n",
    "\n",
    "---\n",
    "\n",
    "```python\n",
    "loadings = pca_model.loadings[['comp_0','comp_1']]\n",
    "```\n",
    "\n",
    "这一行输出了前两个主成分的**载荷矩阵（Loadings）**：\n",
    "\n",
    "$$\n",
    "L = V[:,0:2]\n",
    "$$\n",
    "\n",
    "载荷矩阵表示原始变量在新坐标系（主成分轴）上的投影系数，即主成分是如何由原始变量线性组合而成的。\n",
    "\n",
    "---\n",
    "\n",
    "最后，用前两个主成分还原数据：\n",
    "\n",
    "```python\n",
    "X_df_ = pca_model.project(2)\n",
    "```\n",
    "\n",
    "这是在执行降维投影：\n",
    "\n",
    "$$\n",
    "Z = \\tilde{X} V_{[:,1:2]} \\in \\mathbb{R}^{n \\times 2}\n",
    "$$\n",
    "\n",
    "其中 $Z$ 是降到二维后的新表示。在教学和可视化中，这种还原是非常常见的做法，用来查看是否低维空间可以“近似重构”原始数据的结构。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "39a6501d-7c8a-46d7-b873-7d0e00ba1b4e",
   "metadata": {},
   "source": [
    "## 初始化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "da7e2b25-5b7e-42f9-86dc-4361ba7a9d37",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "import statsmodels.multivariate.pca as pca"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2f54db69-5a3f-47a7-a52b-57c3b71bfb4e",
   "metadata": {},
   "source": [
    "## 加载数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "15ca1de1-434a-41b2-9d40-ab3677c612e8",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_df = pd.read_pickle('X_df.pkl')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e2f17aac-a9cf-46eb-b052-1421328e359e",
   "metadata": {},
   "source": [
    "## 相关性系数矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "d2af7aa1-30fa-4002-89d0-c46bab4a9945",
   "metadata": {},
   "outputs": [],
   "source": [
    "P = X_df.corr()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3e8f95e1-115d-44f7-bc04-ccfd1d40a330",
   "metadata": {},
   "source": [
    "## 主成分分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "5985502f-e7f9-4980-969a-ae8a77f0bc7a",
   "metadata": {},
   "outputs": [],
   "source": [
    "pca_model = pca.PCA(X_df, standardize=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "cb499fb8-b02d-4607-912c-6bc8b3e6c20d",
   "metadata": {},
   "outputs": [],
   "source": [
    "variance_V = pca_model.eigenvals \n",
    "# 计算主成分的方差解释比例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "23e9b012-56cc-450e-8fc4-e26d9a207691",
   "metadata": {},
   "outputs": [],
   "source": [
    "explained_var_ratio = variance_V / variance_V.sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "62c2ea61-30f3-426e-99dd-3d286ec82eb2",
   "metadata": {},
   "outputs": [],
   "source": [
    "PC_range = np.arange(len(variance_V)) + 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "f1bd661e-2a7f-4efc-8307-ad0a8aec30ac",
   "metadata": {},
   "outputs": [],
   "source": [
    "labels = ['$PC_' + str(index) + '$' for index in PC_range]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "98e6bed4-8862-4e57-b53d-2539edaae990",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.9, 8.1)"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 600x300 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 陡坡图\n",
    "fig, ax1 = plt.subplots(figsize = (6,3))\n",
    "\n",
    "ax1.plot(PC_range, variance_V, 'b', marker = 'x')\n",
    "ax1.set_xlabel('Principal Component')\n",
    "ax1.set_ylabel(r'Eigen value $\\lambda$ (PC variance)', color='b')\n",
    "ax1.set_ylim(0,1600); ax1.set_xticks(PC_range)\n",
    "\n",
    "ax2 = ax1.twinx()\n",
    "ax2.plot(PC_range, np.cumsum(explained_var_ratio)*100, \n",
    "         'r', marker = 'x')\n",
    "ax2.set_ylabel(r'Cumulative ratio of explained variance (%)',\n",
    "               color='r')\n",
    "ax2.set_ylim(20,100)\n",
    "ax2.set_xlim(PC_range.min() - 0.1,PC_range.max() + 0.1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c2e23e28-f5b7-47d2-afe1-1b7ba35cdd03",
   "metadata": {},
   "source": [
    "## PCA载荷"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0d5c40c0-4d9a-4073-97d6-a1454eddac00",
   "metadata": {},
   "outputs": [],
   "source": [
    "loadings= pca_model.loadings[['comp_0','comp_1']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "6d85bddd-19e4-4e1d-bf03-ed2bea68f50f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>comp_0</th>\n",
       "      <th>comp_1</th>\n",
       "      <th>comp_2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0.5 yr</th>\n",
       "      <td>0.256636</td>\n",
       "      <td>-0.570500</td>\n",
       "      <td>-0.715678</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1 yr</th>\n",
       "      <td>0.317182</td>\n",
       "      <td>-0.488501</td>\n",
       "      <td>0.197301</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2 yr</th>\n",
       "      <td>0.358665</td>\n",
       "      <td>-0.294732</td>\n",
       "      <td>0.403551</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5 yr</th>\n",
       "      <td>0.389874</td>\n",
       "      <td>0.018947</td>\n",
       "      <td>0.280251</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7 yr</th>\n",
       "      <td>0.391000</td>\n",
       "      <td>0.125592</td>\n",
       "      <td>0.160478</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10 yr</th>\n",
       "      <td>0.387324</td>\n",
       "      <td>0.215072</td>\n",
       "      <td>0.039425</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20 yr</th>\n",
       "      <td>0.359370</td>\n",
       "      <td>0.363357</td>\n",
       "      <td>-0.270587</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30 yr</th>\n",
       "      <td>0.347625</td>\n",
       "      <td>0.393208</td>\n",
       "      <td>-0.327046</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          comp_0    comp_1    comp_2\n",
       "0.5 yr  0.256636 -0.570500 -0.715678\n",
       "1 yr    0.317182 -0.488501  0.197301\n",
       "2 yr    0.358665 -0.294732  0.403551\n",
       "5 yr    0.389874  0.018947  0.280251\n",
       "7 yr    0.391000  0.125592  0.160478\n",
       "10 yr   0.387324  0.215072  0.039425\n",
       "20 yr   0.359370  0.363357 -0.270587\n",
       "30 yr   0.347625  0.393208 -0.327046"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "loadings"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "43e96b97-5858-48b7-b230-3f67a0b13676",
   "metadata": {},
   "source": [
    "## 用前2主成分获得还原数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "6408fe71-9a61-4dd4-8bc7-53165f67d2cf",
   "metadata": {},
   "outputs": [],
   "source": [
    "X_df_ = pca_model.project(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b9a68cff-9724-4e5b-a5e5-6a25e32b58ac",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "5952f639-b3eb-4161-ac42-1f1d9608ff17",
   "metadata": {},
   "source": [
    "作者\t**生姜DrGinger**  \n",
    "脚本\t**生姜DrGinger**  \n",
    "视频\t**崔崔CuiCui**  \n",
    "开源资源\t[**GitHub**](https://github.com/Visualize-ML)  \n",
    "平台\t[**油管**](https://www.youtube.com/@DrGinger_Jiang)\t\t\n",
    "\t\t[**iris小课堂**](https://space.bilibili.com/3546865719052873)\t\t\n",
    "\t\t[**生姜DrGinger**](https://space.bilibili.com/513194466)  "
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:base] *",
   "language": "python",
   "name": "conda-base-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
